/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.reporte.control;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import java.util.List;
import org.reporte.modelo.DatosReporte;

/**
 *
 * @author luisrg
 */
public abstract class DatosReporteControl {

    private final String CORRELATIVO_DATOS_REPORTE = "SELECT (max(id_datos_reporte) + 1) FROM  DATOS_REPORTE";
    private final String CORRELATIVO_REPORTE_GENERAR = "SELECT (max(id_Reporte_Generar) + 1) FROM  DATOS_REPORTE";
    private final String INGRESO_DATOS_REPORTE = "INSERT INTO DATOS_REPORTE (id_Datos_Reporte,id_Reporte_Generar, nombre, valor, usuario_Genera, id_Reporte, fecha_Creacion) VALUES (?,?,?,?,?,?,?)";
    private final String CODIGO_REPORTE = "SELECT id_reporte FROM  REPORTE WHERE nombre = ?";
    private final String ENTIDAD_PARAMETROS = "PARAMETRO_SISTEMA";
    private Long idReporteGenerar;
    
    
    public DatosReporteControl() {
    }

    protected Long ejecutarTransaccionParametros(Long idReporte,String usuario, List<DatosReporte> datosReporte) throws SQLException, Exception {
        Long idReporteGenerar = 0L;
        PreparedStatement ps = null;
        try {
            conexion().setAutoCommit(false);
            idReporteGenerar = obtenerCorrelativoReporteGenerar();
            for(DatosReporte d : datosReporte){
                ps = conexion().prepareStatement(INGRESO_DATOS_REPORTE);
                ps.setLong(     1, obtenerCorrelativoDatosreporte());
                ps.setLong(     2, idReporteGenerar);
                ps.setString(   3, d.getNombre());
                ps.setString(   4, d.getValor());
                ps.setString(   5, usuario);
                ps.setLong(     6, idReporte);
                ps.setDate(     7, new java.sql.Date(Calendar.getInstance().getTimeInMillis()));
                ps.execute();
                ps.close();
            }
            conexion().commit();
            this.idReporteGenerar = idReporteGenerar;
            return idReporteGenerar;
        } catch (SQLException sqlEx) {
            sqlEx.printStackTrace();
            conexion().rollback();
            throw sqlEx;
        } catch (Exception e) {
            e.printStackTrace();
            conexion().rollback();
            throw e;
        }finally{
            if(ps!=null)
                ps.close();
        }

    }
    
    
     protected Long obtenerCodigoReporte(String nombreReporte) throws Exception{
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
             ps = conexion().prepareStatement(CODIGO_REPORTE);
             ps.setString(1, nombreReporte);
             rs = ps.executeQuery();
            if(rs.next()){
                
                return rs.getLong(1);
            }
            return null;
        }catch(Exception e){
            throw e;
        }finally{
            if(rs!=null)
                rs.close();
            if(ps!=null)
                ps.close();
        }
    }
    
    
    private Long obtenerCorrelativoDatosreporte() throws Exception{
        Statement st = null;
        ResultSet rs = null;
        Long valor = 0L;
        try{
             st = conexion().createStatement();
             rs = st.executeQuery(CORRELATIVO_DATOS_REPORTE);
            if(rs.next()){
                valor= rs.getLong(1);
            }
            if(valor == 0)
                 valor = 1L;
            return valor;
        }catch(Exception e){
            throw e;
        }finally{
            if(rs!=null)
                rs.close();
            if(st!=null)
                st.close();
        }
    }
    
        
        private Long obtenerCorrelativoReporteGenerar() throws Exception{
        Statement st = null;
        ResultSet rs = null;
        Long valor = 0L;
        try{
             st = conexion().createStatement();
             rs = st.executeQuery(CORRELATIVO_REPORTE_GENERAR);
            if(rs.next()){
                valor = rs.getLong(1);
            }
             if(valor == 0)
                 valor = 1L;
             
            return valor;
        }catch(Exception e){
            throw e;
        }finally{
            if(rs!=null)
                rs.close();
            if(st!=null)
                st.close();
        }
    }
        
        
        /**
     * Obtiene el valor de un parametro del sistema que se encuentra almacenado en la base de datos
     * @param parametro nombre del parametro que se desea obtener
     * @return valor parametro
     */
    protected String obtenerParametroSistema(String parametro) throws Exception{
        PreparedStatement ps = null;
        ResultSet rs = null;
        String valor = null;
        try{
            ps = conexion().prepareStatement(generarSentenciaParametros());
            ps.setString(1, parametro);
            rs = ps.executeQuery();
            if(rs.next()){
                valor = rs.getString(1);
            }
            return valor;
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }
    }


      /**
     * Obtiene el id identificaddor del reporte
     * @param nombreReporte nombre del reporte que se desea obtener el identificador
     * @return Long idReporte
     */
    protected Long obtenerIdReporte(String nombreReporte) throws Exception{
        PreparedStatement ps = null;
        ResultSet rs = null;
        Long valor = null;
        try{
            ps = conexion().prepareStatement("select id_reporte from reporte where nombre like ?");
            ps.setString(1, "%"+nombreReporte+"%");
            rs = ps.executeQuery();
            if(rs.next()){
                valor = rs.getLong(1);
            }
            return valor;
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }
    }
    
    
    /**
     * Metodo genera la sentencia para consulta a la tabla de parametros del sistema
     */
    protected String generarSentenciaParametros(){
        if(getEntidadParametros()==null || getEntidadParametros().trim().equals("")){
            setEntidadParametros(ENTIDAD_PARAMETROS);
        }
        return "SELECT VALOR FROM " + getEntidadParametros() + " WHERE NOMBRE = ?";
    }
    
    public abstract String getEntidadParametros();
    
    public abstract void setEntidadParametros(String entidadParametros);
    

    public Long getIdReporteGenerar() {
        return idReporteGenerar;
    }


    public abstract Connection conexion();
    

}
